import configparser
import os
from configparser import ConfigParser


def load_config(config_name: str, check_exist: bool = False) -> None | bool | ConfigParser:
    """
    加载配置文件并返回配置解析器对象。如果配置文件不存在，不抛出异常，返回None。

    Args:
        config_name (str): 配置文件名

    Returns:
        configparser.ConfigParser or None: 配置解析器对象或None
        :param config_name:
        :param check_exist:
    """
    # 增加输入验证
    if not config_name or not config_name.endswith('.ini'):
        print("配置文件名不能为空或格式不正确")
        return None  # 或执行其他自定义逻辑

    # 构造安全的配置文件路径，避免路径遍历攻击
    # 确定是否从测试目录调用并相应地调整config_dir
    current_dir = os.path.dirname(os.path.abspath(__file__))
    if 'tests' in current_dir:
        config_dir = os.path.join(current_dir, '..', 'config')
    elif 'lib' in current_dir:
        config_dir = os.path.join(current_dir, '../..', 'config')
    else:
        config_dir = 'config'

    config_dir = os.path.normpath(config_dir)  # 规范化路径以解析任何“..'

    safe_config_name = os.path.basename(config_name)
    config_path = os.path.join(config_dir, safe_config_name)

    # 检查配置文件是否存在并是一个文件
    try:
        # 首先检查文件路径是否存在以及是否为文件
        if not os.path.exists(config_path) or not os.path.isfile(config_path):
            print(f"配置文件 {config_path} 不存在或不是一个文件")
            return None  # 如果文件不存在或不是文件，则返回None
        else:
            # 如果仅检查存在性，则返回True
            if check_exist:
                return True

    except Exception as e:
        print(f"检查配置文件时发生异常：{e}")
        raise

    # 创建配置解析器对象
    config = configparser.ConfigParser()

    # 尝试读取配置文件，捕捉可能的解析异常
    try:
        config.read(config_path)
    except configparser.Error as e:
        print(f"解析配置文件 {config_path} 时发生错误：{e}")
        raise

    return config
